<?php
$pathToThis = pathinfo(__FILE__) ;
$retTratador = getcwd() ;
chdir($pathToThis['dirname']) ;
require_once "../base/ParametrosAcao.class.php";
require_once "../base/Formulario.class.php";

chdir($retTratador);

class Tratador {
	
	const FORM_CLASSES = "classes/forms/";
	
	/**
	* @var ParametrosAcao
	**/
	private $parametrosAcao = null;
	private $formChamador = null;
	
    public function Tratador(ParametrosAcao $p) {
    	$this->parametrosAcao = $p;
    	$get = $p->getGetVars();
    	
    	$this->formChamador = $_SESSION[$get['classe']];
    }
    
    public function atualizaValoresForm() {
		$this->formChamador->setParametros($this->parametrosAcao);
    	$classe = new ReflectionClass(get_class($this->formChamador));
    	while ($classe->getName() !== "Formulario") {
	    	$atributos = $classe->getProperties();
	//    	print_r($atributos);die();
	    	$post = $this->parametrosAcao->getPostVars();
	    	for ($i=0; $i<count($atributos); $i++) {
	    		$propertieName = $atributos[$i]->getName();
	    		$methodName = "get".strtoupper($propertieName[0]).substr($propertieName, 1);
	    		if (array_search($methodName, get_class_methods(get_class($this->formChamador)))) {
		    		$method = new ReflectionMethod(get_class($this->formChamador), $methodName);
	    			$componente = $method->invoke($this->formChamador);
	    			if (is_a($componente, 'Componente') && (!is_null($componente))) {
	    				if (!isset($post[$propertieName])) {
	    					$componente->atualizaValor($propertieName, null, $this->parametrosAcao);
	    				}
	    				else 
	    					$componente->atualizaValor($propertieName, $post[$propertieName], $this->parametrosAcao);
	//	    			if (!isset($post[$propertieName])) {
	//						$componente->setValorSubmetido(false);
	//						//$componente->setValorSetado(false);
	//					}
	//	    			else if (!is_null($post[$propertieName])) { 
	//	    				$componente->setValorSubmetido($post[$propertieName]);
	//	    				$componente->setValorSetado(false);
	//	    			}
	    			}
	    		}
    		}
    		$classe = $classe->getParentClass();
    	}
    }
    
    public function chamaInitForm() {
    	$retorno =  $this->formChamador->init();
    	return $retorno;
    }
    
    public function finalizaValoresForm() {
    	$classe = new ReflectionClass(get_class($this->formChamador));
    	while ($classe->getName() !== "Formulario") {
	    	$atributos = $classe->getProperties();
	    	$post = $this->parametrosAcao->getPostVars();
	    	for ($i=0; $i<count($atributos); $i++) {
	    		$propertieName = $atributos[$i]->getName();
	    		$methodName = "get".strtoupper($propertieName[0]).substr($propertieName, 1);
	    		if (array_search($methodName, get_class_methods(get_class($this->formChamador)))) {
		    		$method = new ReflectionMethod(get_class($this->formChamador), $methodName);
	    			$componente = $method->invoke($this->formChamador);
	    			if (is_a($componente, 'Componente') && (!is_null($componente)) && (!$componente->valorFoiSetado())) {
	    				$componente->finalizaValor();
	    				//$componente->setValor($componente->getValorSubmetido());
	    				//$componente->setValorSubmetido(null);
	    			}
	    		}
	    	}
    		$classe = $classe->getParentClass();
    	}
    }
    
    public function filtra() {
    
    }
    
    public function executaMetodoClasse() {
    	$get = $this->parametrosAcao->getGetVars();
    	$methodName = "executa" . strtoupper($get['action'][0]) . substr($get['action'], 1);

    	$method = new ReflectionMethod(get_class($this->formChamador), $methodName);
    	try {
    		$response = $method->invoke($this->formChamador, $this->parametrosAcao);
    	}
    	catch (Exception $e) {
    		$this->formChamador->adicionaMensagemErro($e->display());
    	}
    	if ($response != null)
    		return $response;
    	else
    		//return $this->formChamador->getPhp();
			return $this->parametrosAcao->getHttpReferer();
    }
}
?>